ROS 最為一款廣為人知的機器人作業系統,當然也能讓很多種程式語言來做使用。 儘管是不同的程式語言,但是他們都是需要建立 Topic 、 Service 、 param 等等 來讓 ROS 可以進行通訊, 而此時便是需要 ROS Client Library 的時候了,他便是 ROS 提供給我們的 API ,可以讓我們輕鬆的跨語言去溝通。
這邊是目前 ROS 支援的 Client Library
Client Library | 介绍 |
---|---|
roscpp | ROS的C++庫,是目前最廣泛應用的ROS客戶端庫,執行速度快 |
rospy | ROS的Python庫,開發速度快,通常用在對運行時間沒有太大要求的場合,例如配置、初始化等操作 |
roslisp | ROS的LISP庫 |
roscs | Mono/.NET.庫,可用任何Mono/.NET語言,包括C#,Iron Python, Iron Ruby等 |
roseus | EusLisp 語言庫 |
rosgo | ROS Go 語言庫 |
rosjava | ROS Java 語言庫 |
rosnodejs | Javascript 客戶端庫 |
RobotOS.jl | Julia 語言庫 |
rosR | R 語言庫 |
rosruby | ruby 語言庫 |
ROS-MATLAB Interface | 跟 MATLAB 的 ROS 工具包 進行通訊用 |
ROS-Simulink Interface | 跟 Simulink 的 ROS 節點進行通訊用 |
目前最常被用到的還是只有 ROS CPP 、 ROS Py 所以後面介紹還是以這兩個為主。
Roscpp 他被放在 /opt/ros/kinetic 下面, 用 C++ 來達到跟 ROS 通訊的目的,在 ROS 中 , C++ 的程式碼是通過 catkin 來進行編譯的,這在前面有提到,忘記的話可以回去翻一下,所以我們在寫的時候,只要直接 include roscpp 等等的 ROS libraries,我們就可以在 ROS 中進行使用了。
起手式,當我們要去使用 ROS C++ 時,需要把它 include 進來
#include <ros/ros.h>
roscpp 中,他主要的部份包含以下幾點:
詳細的部分可以參考 http://docs.ros.org/api/roscpp/html/index.html
這邊展示一下怎麼從開啟到關閉
#include<ros/ros.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "your_node_name");
ros::NodeHandle nh;
ros::shutdown()
}
首先先引入套件,然後宣告 main 函式,接下來初始化我們的 node 節點,再來我們幫我們的 node 加一個手把 NodeHandle ,讓我們可以方便地去使用他,接下來我們關閉我們的節點 。
接下來我們來看 NodeHandle 有哪一些功能
這個便是創建一個新的 publisher,第一個參數是話題名稱,第二個是資訊最大長度,如果發送的資ㄒ訊大於可被接受的資訊,就會被退回,第三個參數則是來看是否把這個參數鎖住。
這是用來創建一個新的 Subscriber ,,第一個參數是訂閱的話題名稱,第二個是資訊最大長度,但是如果收到的資訊還沒來的及處理,舊的資訊就會被丟掉,第三個參數則是 回傳函數的指標,指標指向一個函式來處理接收到的訊息。
這是用來創建一個新的 ServiceServer , 第一個參數是服務的名稱,第二個是用來設定說服務是否要持續的連接,這樣我們後面在傳遞時會比較快一點
從參數服務器上拿到某個 key 的 value
給 key 對應的 val 賦值
以上便是 NodeHandle 的一些使用方式,從中可以看到 NodeHandle 是很重要的,畢竟溝通類的方式基本上都是靠他完成的。
ros::master 底下有許多的功能可以讓我們進行使用。
函式 | 功能 |
---|---|
bool check() | 檢查 master 是否啟動 |
const string & getHost | 回傳 master 所屬的 hostname |
bool getNodes (V_string &nodes) | 回傳 master 中已知的 node 名稱 |
boolgetTopics (V_TopicInfo &topics) | 回傳所有正在發訊息的 topic 名單 |
bool getURI () | 返回到 master 的 URL 位址 |
uint32_t getPort () | 回傳在正使用中的 port |
void getTopics (V_TopicInfo &topics) | 拿到這個 node 發布的 topic |
以上就是常用到的 master 參數
今天介紹了 ROS Client Library 與 Roscpp ~ 在明天我們將繼續摸索 Roscpp
#Arm Arm Platforms